package br.com.datasun.biblioteca.ui;

import java.awt.BorderLayout;
import images.ImageLoader;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import java.awt.Font;
import java.awt.Insets;
import java.util.List;

import javax.swing.JComboBox;

import br.com.datasun.biblioteca.entities.Biblioteca;
import br.com.datasun.biblioteca.entities.Exemplar;
import br.com.datasun.biblioteca.entities.Livro;
import br.com.datasun.biblioteca.ui.controller.ConsultaExemplaresController;

import br.com.datasun.biblioteca.ui.components.ExemplarConsultaTableModel;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class ConsultaExemplaresUI extends JDialog {

	private final JPanel contentPanel = new JPanel();
	private JPanel buttonPane = new JPanel();
	private JButton jbFechar = new JButton("");
	private final JPanel jpCabecalho = new JPanel();
	private final JPanel JpTabela = new JPanel();
	private final JLabel jlTitulo = new JLabel("T\u00EDtulo");
	private final JLabel jlTituloDescricao = new JLabel("New label");
	private final JLabel jlEdicao = new JLabel("Edi\u00E7\u00E3o");
	private final JLabel jlEdicaoDescricao = new JLabel("New label");
	private final JLabel jlEditora = new JLabel("Editora");
	private final JLabel jlEditoraDescricao = new JLabel("New label");
	private final JLabel jlAutores = new JLabel("Autores");
	private final JLabel jlAutoresDescricao = new JLabel("New label");
	private final JLabel jlAnoLancamento = new JLabel("Ano Lan\u00E7amento");
	private final JLabel jlAnoLancamentoDescricao = new JLabel("New label");
	private final JLabel jlBiblioteca = new JLabel("Biblioteca");
	private final JComboBox jcBiblioteca = new JComboBox();
	private final JPanel pnlTabelaEsquerda = new JPanel();
	private final JPanel pnlTabelaDireita = new JPanel();
	
	private JTable tabelaExemplares = new  JTable();
	private ExemplarConsultaTableModel model = new ExemplarConsultaTableModel();
	private final JScrollPane scrollPane = new JScrollPane();
	
	private Livro livroSelecionado;
	private ConsultaExemplaresController controller;

	
	/**
	 * Create the dialog.
	 */
	public ConsultaExemplaresUI(Livro livro) {
		
		this.livroSelecionado = livro;
		setTitle("Consultas de Exemplares Dispon\u00EDveis");
		setBounds(100, 100, 642, 499);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(new BorderLayout(0, 0));
		
		contentPanel.add(jpCabecalho, BorderLayout.NORTH);
		jpCabecalho.setPreferredSize(new Dimension(0,200));
		GridBagLayout gbl_jpCabecalho = new GridBagLayout();
		gbl_jpCabecalho.columnWidths = new int[]{126, 180, 110, 0};
		gbl_jpCabecalho.rowHeights = new int[]{54, 25, 25, 25, 25, 25, 0};
		gbl_jpCabecalho.columnWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
		gbl_jpCabecalho.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		jpCabecalho.setLayout(gbl_jpCabecalho);
		
		GridBagConstraints gbc_jlTitulo = new GridBagConstraints();
		gbc_jlTitulo.insets = new Insets(0, 0, 5, 5);
		gbc_jlTitulo.anchor = GridBagConstraints.SOUTHEAST;
		gbc_jlTitulo.gridx = 0;
		gbc_jlTitulo.gridy = 0;
		jlTitulo.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpCabecalho.add(jlTitulo, gbc_jlTitulo);
		
		GridBagConstraints gbc_jlTituloDescricao = new GridBagConstraints();
		gbc_jlTituloDescricao.gridwidth = 2;
		gbc_jlTituloDescricao.insets = new Insets(0, 0, 5, 5);
		gbc_jlTituloDescricao.anchor = GridBagConstraints.SOUTHWEST;
		gbc_jlTituloDescricao.gridx = 1;
		gbc_jlTituloDescricao.gridy = 0;
		jpCabecalho.add(jlTituloDescricao, gbc_jlTituloDescricao);
		
		GridBagConstraints gbc_jlEdicao = new GridBagConstraints();
		gbc_jlEdicao.anchor = GridBagConstraints.EAST;
		gbc_jlEdicao.insets = new Insets(0, 0, 5, 5);
		gbc_jlEdicao.gridx = 0;
		gbc_jlEdicao.gridy = 1;
		jlEdicao.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpCabecalho.add(jlEdicao, gbc_jlEdicao);
		
		GridBagConstraints gbc_jlEdicaoDescricao = new GridBagConstraints();
		gbc_jlEdicaoDescricao.gridwidth = 2;
		gbc_jlEdicaoDescricao.insets = new Insets(0, 0, 5, 5);
		gbc_jlEdicaoDescricao.anchor = GridBagConstraints.WEST;
		gbc_jlEdicaoDescricao.gridx = 1;
		gbc_jlEdicaoDescricao.gridy = 1;
		jpCabecalho.add(jlEdicaoDescricao, gbc_jlEdicaoDescricao);
		
		GridBagConstraints gbc_jlEditora = new GridBagConstraints();
		gbc_jlEditora.anchor = GridBagConstraints.EAST;
		gbc_jlEditora.insets = new Insets(0, 0, 5, 5);
		gbc_jlEditora.gridx = 0;
		gbc_jlEditora.gridy = 2;
		jlEditora.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpCabecalho.add(jlEditora, gbc_jlEditora);
		
		GridBagConstraints gbc_jlEditoraDescricao = new GridBagConstraints();
		gbc_jlEditoraDescricao.gridwidth = 2;
		gbc_jlEditoraDescricao.insets = new Insets(0, 0, 5, 5);
		gbc_jlEditoraDescricao.anchor = GridBagConstraints.WEST;
		gbc_jlEditoraDescricao.gridx = 1;
		gbc_jlEditoraDescricao.gridy = 2;
		jpCabecalho.add(jlEditoraDescricao, gbc_jlEditoraDescricao);
		
		GridBagConstraints gbc_jlAutores = new GridBagConstraints();
		gbc_jlAutores.anchor = GridBagConstraints.EAST;
		gbc_jlAutores.insets = new Insets(0, 0, 5, 5);
		gbc_jlAutores.gridx = 0;
		gbc_jlAutores.gridy = 3;
		jlAutores.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpCabecalho.add(jlAutores, gbc_jlAutores);
		
		GridBagConstraints gbc_jlAutoresDescricao = new GridBagConstraints();
		gbc_jlAutoresDescricao.gridwidth = 2;
		gbc_jlAutoresDescricao.insets = new Insets(0, 0, 5, 5);
		gbc_jlAutoresDescricao.anchor = GridBagConstraints.WEST;
		gbc_jlAutoresDescricao.gridx = 1;
		gbc_jlAutoresDescricao.gridy = 3;
		jpCabecalho.add(jlAutoresDescricao, gbc_jlAutoresDescricao);
		
		GridBagConstraints gbc_jlAnoLancamento = new GridBagConstraints();
		gbc_jlAnoLancamento.anchor = GridBagConstraints.EAST;
		gbc_jlAnoLancamento.insets = new Insets(0, 0, 5, 5);
		gbc_jlAnoLancamento.gridx = 0;
		gbc_jlAnoLancamento.gridy = 4;
		jlAnoLancamento.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpCabecalho.add(jlAnoLancamento, gbc_jlAnoLancamento);
		
		GridBagConstraints gbc_jlAnoLancamentoDescricao = new GridBagConstraints();
		gbc_jlAnoLancamentoDescricao.gridwidth = 2;
		gbc_jlAnoLancamentoDescricao.insets = new Insets(0, 0, 5, 5);
		gbc_jlAnoLancamentoDescricao.anchor = GridBagConstraints.WEST;
		gbc_jlAnoLancamentoDescricao.gridx = 1;
		gbc_jlAnoLancamentoDescricao.gridy = 4;
		jpCabecalho.add(jlAnoLancamentoDescricao, gbc_jlAnoLancamentoDescricao);
		
		GridBagConstraints gbc_jlBiblioteca = new GridBagConstraints();
		gbc_jlBiblioteca.anchor = GridBagConstraints.EAST;
		gbc_jlBiblioteca.insets = new Insets(0, 0, 0, 5);
		gbc_jlBiblioteca.gridx = 0;
		gbc_jlBiblioteca.gridy = 5;
		jlBiblioteca.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpCabecalho.add(jlBiblioteca, gbc_jlBiblioteca);
		
		GridBagConstraints gbc_jcBiblioteca = new GridBagConstraints();
		gbc_jcBiblioteca.insets = new Insets(0, 0, 0, 5);
		gbc_jcBiblioteca.fill = GridBagConstraints.HORIZONTAL;
		gbc_jcBiblioteca.gridx = 1;
		gbc_jcBiblioteca.gridy = 5;
		jcBiblioteca.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent arg0) {
				controller.carregarExemplaresDaBibliotecaSelecionada();
			}
		});
		jpCabecalho.add(jcBiblioteca, gbc_jcBiblioteca);
		
		contentPanel.add(JpTabela, BorderLayout.CENTER);
		JpTabela.setLayout(new BorderLayout(0, 0));
		
		JpTabela.add(pnlTabelaEsquerda, BorderLayout.WEST);
		
		JpTabela.add(pnlTabelaDireita, BorderLayout.EAST);
		JpTabela.add(scrollPane, BorderLayout.CENTER);
		
		scrollPane.setViewportView(tabelaExemplares);
		tabelaExemplares.setModel(model);
		
		buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
		getContentPane().add(buttonPane, BorderLayout.SOUTH);
		jbFechar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				controller.btnFecharEventHandler();
			}
		});
		
		jbFechar.setPreferredSize(new Dimension(115,25));
		jbFechar.setIcon(ImageLoader.createImageIcon("btnFechar115x25.png"));
		
		buttonPane.add(jbFechar);		
		
		limparFormulario();
		controller = new ConsultaExemplaresController(this);
		controller.carregarBibliotecas();
		
	}
	
	public void inicializarComboBiblioteca(List<Biblioteca> bibliotecas){
		for (Biblioteca biblioteca : bibliotecas){
			jcBiblioteca.addItem(biblioteca);
		}
	}
	
	public Biblioteca getBibliotecaSelecionada(){
		Biblioteca result = null;
		if (jcBiblioteca.getItemCount()>0){
			result = (Biblioteca) jcBiblioteca.getSelectedItem();
		}
		return result;
	}

	public void setLivroSelecionado(Livro livroSelecionado) {
		this.livroSelecionado = livroSelecionado;
	}

	public Livro getLivroSelecionado() {
		return livroSelecionado;
	}
	
	public void exibirDadosLivroSelecionado(){
		if (livroSelecionado != null){
			jlTituloDescricao.setText(livroSelecionado.getTitulo());
		    jlEdicaoDescricao.setText(Integer.toString(livroSelecionado.getEdicao()));
	    	jlEditoraDescricao.setText(livroSelecionado.getEditora().getNome());
		    jlAutoresDescricao.setText(livroSelecionado.getAutoresString());
		    jlAnoLancamentoDescricao.setText(Integer.toString(livroSelecionado.getAnoLancamento()));
		}
	}
	
	public List<Exemplar> getExemplar(){
		return model.getExemplares();
	}
	
	public void setExemplares(List<Exemplar> exemplares){
		model.setExemplares(exemplares);
	}
	
	public void atualizarGrid(){
		model.AtualizarGrid();
	}
	
	public void limparExemplares(){
		model.limparExemplares();
		atualizarGrid();
	}
	
	public void limparFormulario(){
		jlTituloDescricao.setText("");
		jlEdicaoDescricao.setText("");
		jlEditoraDescricao.setText("");
		jlAutoresDescricao.setText("");
		jlAnoLancamentoDescricao.setText("");
		jcBiblioteca.removeAllItems();
		limparExemplares();
		atualizarGrid();
	}

}
